Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_web_audio_bridge.py

Displaying Raw • Download


tests/backend/test_web_audio_bridge.py 56d219df611efdff155d9bf5a355970d8569c098 (56d219df) Text, 2.33 KB

Tff7b72import T7ee787asyncio
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch

Tff7b72import T7ee787numpy Tff7b72as T7ee787np
Tff7b72import T7ee787pytest

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787web_audio_bridge Tff7b72import Tb4b4b4(
Te6edf3WebAudioBridgeTb4b4b4,
Te6edf3WebAudioSinkTb4b4b4,
Te6edf3WebAudioSourceTb4b4b4,
Tb4b4b4)


Tff7b72class T56d364_DummySinkTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffframes Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72def Td2a8ffcan_receiveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_sourceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True

Tff7b72def Td2a8ffhandle_frameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frameTb4b4b4, Te6edf3sourceTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffframesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3frameTb4b4b4)


Tff7b72def Td2a8fftest_web_audio_source_pushes_framesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3sink Tff7b72= Te6edf3_DummySinkTb4b4b4(Tb4b4b4)
Te6edf3src Tff7b72= Te6edf3WebAudioSourceTb4b4b4(Te6edf3target_frame_msTff7b72=T79c0ff60Tb4b4b4, Te6edf3sinkTff7b72=Te6edf3sinkTb4b4b4)
Te6edf3zeros Tff7b72= Te6edf3npTff7b72.Td2a8ffzerosTb4b4b4(T79c0ff160Tb4b4b4, Te6edf3dtypeTff7b72=Te6edf3npTff7b72.Td2a8ffint16Tb4b4b4)
Te6edf3srcTff7b72.Td2a8ffpush_pcmTb4b4b4(Te6edf3zerosTff7b72.Td2a8fftobytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3sinkTff7b72.Td2a8ffframesTb4b4b4) Tff7b72== T79c0ff1


Tff7b72def Td2a8fftest_web_audio_sink_encodes_and_sends_bytesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3loop Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffnew_event_loopTb4b4b4(Tb4b4b4)
Te6edf3asyncioTff7b72.Td2a8ffset_event_loopTb4b4b4(Te6edf3loopTb4b4b4)
Te6edf3sent Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72async Tff7b72def Td2a8ff_send_bytesTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3sentTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dataTb4b4b4)

Te6edf3sink Tff7b72= Te6edf3WebAudioSinkTb4b4b4(Te6edf3loopTb4b4b4, Te6edf3_send_bytesTb4b4b4)
Te6edf3sinkTff7b72.Td2a8ffhandle_frameTb4b4b4(Te6edf3npTff7b72.Td2a8ffzerosTb4b4b4(Tb4b4b4(T79c0ff160Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4, Te6edf3dtypeTff7b72=Te6edf3npTff7b72.Td2a8fffloat32Tb4b4b4)Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3loopTff7b72.Td2a8ffrun_until_completeTb4b4b4(Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)Tb4b4b4)
Te6edf3loopTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3sentTb4b4b4, Ta5d6ff"Ta5d6ffexpected audio bytes to be queued for sendingTa5d6ff"


Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_web_audio_bridge_lazy_loopTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Test that WebAudioBridge retrieves the loop lazily to avoid startup crashes."""
Te6edf3mock_tele_mgr Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_config_mgr Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)

T8b949e# Mock get_event_loop to simulate it not being available during init
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffasyncio.get_event_loopTa5d6ff"Tb4b4b4, Te6edf3side_effectTff7b72=Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo running loopTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3bridge Tff7b72= Te6edf3WebAudioBridgeTb4b4b4(Te6edf3mock_tele_mgrTb4b4b4, Te6edf3mock_config_mgrTb4b4b4)
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ff_loop Tff7b72is Tff7b72None

T8b949e# Simulate a running loop
Te6edf3current_loop Tff7b72= Te6edf3asyncioTff7b72.Td2a8ffget_running_loopTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffloop Tff7b72== Te6edf3current_loop
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ff_loop Tff7b72== Te6edf3current_loop


Tff7b72def Td2a8fftest_web_audio_bridge_asyncutils_fallbackTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Test that WebAudioBridge falls back to AsyncUtils.main_loop if no loop is running."""
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787async_utils Tff7b72import Te6edf3AsyncUtils

Te6edf3mock_loop Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3specTff7b72=Te6edf3asyncioTff7b72.Td2a8ffAbstractEventLoopTb4b4b4)
Te6edf3AsyncUtilsTff7b72.Td2a8ffset_main_loopTb4b4b4(Te6edf3mock_loopTb4b4b4)

Te6edf3mock_tele_mgr Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_config_mgr Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffasyncio.get_running_loopTa5d6ff"Tb4b4b4, Te6edf3side_effectTff7b72=Tf85149RuntimeErrorTb4b4b4)Tb4b4b4:
Te6edf3bridge Tff7b72= Te6edf3WebAudioBridgeTb4b4b4(Te6edf3mock_tele_mgrTb4b4b4, Te6edf3mock_config_mgrTb4b4b4)
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ffloop Tff7b72== Te6edf3mock_loop
Tff7b72assert Te6edf3bridgeTff7b72.Td2a8ff_loop Tff7b72== Te6edf3mock_loop


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────